package com.atiguigu.rabbitmq.three;

import com.atiguigu.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.MessageProperties;

import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;
/*
producer 发送大量消息
当某个消息再接受过程中出现异常，队列却已经将他删除，导致消息丢失
为避免这种情况，消息再正常接收时会手动应答，
若队列未收到应答，说明没有正常接收，将此消息重新放入队列，重新消费
*
*/
public class Task02 {
    //队列名称
    public static  final String Task_QUEUE_NAME="ack_queue";

    //发送大量消息
    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMqUtils.getChannel();
        //信道开启发布确认模式
        channel.confirmSelect();
        boolean durable=true;//队列持久化
        channel.queueDeclare(Task_QUEUE_NAME,durable,false,false,null);
        /*
        * inequivalent arg 'durable' for queue 'ack_queue' in vhost '/': received 'true' but current is 'false'
        * 原先队列不持久化，不能强行改为持久化，要先删除原先队列
        * */
        //控制台接收消息发消息
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            String message=scanner.next();
            //设置发送消息持久化（保存在磁盘上） MessageProperties.PERSISTENT_TEXT_PLAIN
            channel.basicPublish("",Task_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));
            System.out.println("生产者发送消息完成："+message);
        }
    }
}
